package main

import (
	"fmt"
	"strings"
	"unicode"
)

func main() {
	// 字符串比较 ,可用 == < > 代替
	fmt.Println(strings.Compare("a", "b")) // -1
	fmt.Println(strings.Compare("a", "a")) // 0
	fmt.Println(strings.Compare("b", "a")) // 1
	// 是否包含
	fmt.Println(strings.Contains("我爱中国", "中国"))  // true
	fmt.Println(strings.Contains("我爱中国", "中国人")) // false
	fmt.Println(strings.Contains("我爱中国", ""))    // true
	fmt.Println(strings.Contains("", ""))        // true
	// 是否任意包含
	fmt.Println(strings.ContainsAny("我爱中国", "中国万岁")) // true
	fmt.Println(strings.ContainsAny("user", "ui"))   // true
	fmt.Println(strings.Contains("我爱中国", ""))        // true
	fmt.Println(strings.Contains("", ""))            // true
	// 是否包含 unicode码
	fmt.Println(strings.ContainsRune("abc", 97))  // true
	fmt.Println(strings.ContainsRune("time", 97)) // false
	// 计算包含数量
	fmt.Println(strings.Count("cheese", "e")) // 3
	fmt.Println(strings.Count("five", ""))    // 5

	// 不区分大小的比较
	fmt.Println(strings.EqualFold("Go", "go")) // true

	// 按空格（可多个空格）分割
	fmt.Printf("Fields are:%q\n", strings.Fields("  我  爱 中国")) // Fields are:["我" "爱" "中国"]  类型：[]string
	// 按自定义函数分类
	fmt.Printf("fields are:%q\n", strings.FieldsFunc("  我;爱,中，国...", func(r rune) bool {
		return !unicode.IsLetter(r) && !unicode.IsNumber(r)
	})) // fields are:["我" "爱" "中" "国"]

	// 判断前缀
	fmt.Println(strings.HasPrefix("Gopher", "go")) // false
	fmt.Println(strings.HasPrefix("Gopher", "Go")) // true
	fmt.Println(strings.HasPrefix("Gopher", ""))   // true
	// 判断后缀
	fmt.Println(strings.HasSuffix("Gopher", "er")) // true

	// 查找字符在 s 中的位置，不存在返回 -1
	fmt.Println(strings.Index("chicken", "ch")) // 0
	fmt.Println(strings.Index("chicken", "a"))  // -1

	// 查找第一个任意字符在 s 中的位置，不存在返回 -1
	fmt.Println(strings.IndexAny("chicken", "aeiouy")) // 2
	fmt.Println(strings.IndexAny("chicken", ""))       // -1
	fmt.Println(strings.IndexAny("chicken", "wasd"))   // -1

	// 查找 字节 在 s中的位置
	fmt.Println(strings.IndexByte("golang", 'l')) // 2

	// 查找 utf8 字节码 在 s中的位置
	fmt.Println(strings.IndexRune("golang", 'a')) // 3

	// 查找第一个满足函数条件的位置，不存在返回 -1
	isHan := func(r rune) bool {
		return unicode.Is(unicode.Han, r) // 查找汉字
	}
	fmt.Println(strings.IndexFunc("Hello, world", isHan)) // -1
	fmt.Println(strings.IndexFunc("Hello, 世界", isHan))    // 7

	// 查找字符第后一个在 s 中的位置，不存在返回 -1
	fmt.Println(strings.LastIndex("chicken", "ch")) // 0
	fmt.Println(strings.LastIndex("chicken", "a"))  // -1

	// 查找最后一个任意字符在 s 中的索引，不存在返回 -1
	fmt.Println(strings.LastIndexAny("chicken", "aeiouy")) // 5
	fmt.Println(strings.LastIndexAny("chicken", ""))       // -1
	fmt.Println(strings.LastIndexAny("chicken", "wasd"))   // -1

	// 查找 最后一个字节 在 s中的索引
	fmt.Println(strings.LastIndexByte("golang", 'n')) // 4

	// 查找 最后一个满足函数条件的索引，不存在返回 -1
	fmt.Println(strings.LastIndexFunc("Hello, world", isHan)) // -1
	fmt.Println(strings.LastIndexFunc("Hello, 世界", isHan))    // 10

	// 拼接
	s := []string{"我", "爱", "中国"}
	fmt.Println(strings.Join(s, "，")) // 我，爱，中国

	// Map返回字符串s的一个副本，其中所有字符都根据映射函数进行了修改。
	// 如果映射返回负值，则该字符将从字符串中删除，不进行替换。
	rot13 := func(r rune) rune {
		switch {
		case r >= 'A' && r <= 'Z':
			return 'A' + (r-'A'+13)%26
		case r >= 'a' && r <= 'z':
			return 'a' + (r-'a'+13)%26
		}
		return r
	}
	fmt.Println(strings.Map(rot13, "'Twas brillig and the slithy gopher...")) // 'Gjnf oevyyvt naq gur fyvgul tbcure...

	// 按次数指定重复，必须 `count >= 0`
	fmt.Println("ba" + strings.Repeat("na", 2)) // banana

	// 替换 `n = -1` 替换所有
	fmt.Println(strings.Replace("oink oink oink", "k", "ky", 2))      // oinky oinky oink
	fmt.Println(strings.Replace("oink oink oink", "oink", "moo", -1)) // moo moo moo
	//  替换所有
	fmt.Println(strings.ReplaceAll("oink oink oink", "oink", "moo")) // moo moo moo
	fmt.Println()

	// 分割
	fmt.Printf("%q\n", strings.SplitAfter("a,b,c", ",")) // ["a," "b," "c"]
	// 指定最大分割数量
	fmt.Printf("%q\n", strings.SplitAfterN("a,b,c", ",", 2))  // ["a," "b,c"]
	fmt.Printf("%q\n", strings.SplitAfterN("a,b,c", ",", -1)) // ["a," "b," "c"]
	fmt.Printf("%q\n", strings.SplitN("a,b,c", ",", 2))       // ["a" "b,c"]
	fmt.Printf("%q\n", strings.SplitN("a,b,c", ",", -1))      // ["a" "b" "c"]

	// 单词首字母转大写
	fmt.Println(strings.Title("hello world")) // Hello World
	fmt.Println(strings.Title("хлеб"))        // Хлеб
	// 所有字母转大写
	fmt.Println(strings.ToTitle("Gopher")) // GOPHER
	// 大小写转换
	fmt.Println(strings.ToLower("HELLO")) // hello
	fmt.Println(strings.ToUpper("hello")) // HELLO
	// 指定大小写映射的转换
	fmt.Println(strings.ToTitleSpecial(unicode.TurkishCase, "örnek iş")) // ÖRNEK İŞ
	fmt.Println(strings.ToLowerSpecial(unicode.TurkishCase, "ÖRNEK İŞ")) // örnek iş
	fmt.Println(strings.ToUpperSpecial(unicode.TurkishCase, "örnek iş")) // ÖRNEK İŞ

	// 每次运行无效的UTF-8字节序列时，都会被替换字符串替换，替换字符串可能为空。
	fmt.Println(strings.ToValidUTF8("我爱中国^_^", "")) // 我爱中国^_^

	// 去除两边指定字符
	fmt.Println(strings.Trim("   我 爱中国  ", " "))            // 我 爱中国
	fmt.Println(strings.Trim("¡¡¡Hello, Gophers!!!", "!¡")) // Hello, Gophers

	// 去除左边指定字符
	fmt.Println(strings.TrimLeft("¡¡¡Hello, Gophers!!!", "!¡")) // Hello, Gophers!!!
	// 去除左边指定函数返回true的字符
	fmt.Println(strings.TrimLeftFunc("¡¡¡Hello, Gophers!!!", func(r rune) bool {
		return !unicode.IsLetter(r) && !unicode.IsNumber(r)
	})) // Hello, Gophers!!!

	// 去除指定前缀
	fmt.Println(strings.TrimPrefix("我爱中国", "我爱")) //中国
	// 去除指定后缀
	fmt.Println(strings.TrimSuffix("我爱中国", "中国")) //我爱
	// 去除两边空白
	fmt.Println(strings.TrimSpace(" \\t\\n Hello, Gophers \\n\\t\\r\\n")) // \t\n Hello, Gophers \n\t\r\n

	// type Replacer
	replacer := strings.NewReplacer("<", "&lt;", ">", "&gt;")
	fmt.Println(replacer.Replace("This is <b>Html</b>!")) // This is &lt;b&gt;Html&lt;/b&gt;!

	// type Builder
	var b strings.Builder
	fmt.Fprintf(&b,"%d...",1)
	b.WriteString("ignition ")
	b.WriteRune(98)
	b.Write([]byte{97,69})
	fmt.Println(b.String()) // 1...ignition baE

	// type Reader
	r := strings.NewReader("hello,world")
	fmt.Println("Reader:")
	fmt.Println("Len:",r.Len()) // Len: 11
	fmt.Println("Size:",r.Size()) // Size: 11
	fmt.Println(r.ReadRune())  // 104 1 <nil>

	var r1 strings.Reader
	r1.Reset("Hi")
	fmt.Println(r1.Len()) //2

}
